QEMU 相关
Table of Contents
1. .qcow2 磁盘文件的 L2 缓存
- 每个 .qcow2 文件有一个 L1 table,它记录了所有的 L2 table 的信息
- 每个 L2 table 记录了一个或多个 cluster 的信息
- cluster_size 是 .qcow2 文件大小增长的最小梯度,默认是 64KiB,不能大于 2MiB
- L2 table 的大小等于 cluster_size 的大小 (L2 table 和 cluster 使用的数据结构相同,只是里面存的东西不同)
- QEMU 会在 l2-cache-size 和 8*cluster_size 中选一个较大的值作为 l2-cache-size 的大小
- 64KiB 的 L2 table,可以存储 8192 个 cluster 的地址,每个 L2 table 可以索引 8192 * 64 KiB = 0.5 GiB 的数据
- 128KiB 的 L2 table,可以存储 16384 个 cluster 的地址,每个 L2 table 可以索引 16384 * 128 KiB = 2 GiB 的数据
- 256KiB 的 L2 table,可以存储 32768 个 cluster 的地址,每个 L2 table 可以索引 32768 * 256 KiB = 8 GiB 的数据
- 512KiB 的 L2 table,可以存储 65536 个 cluster 的地址,每个 L2 table 可以索引 65536 * 512 KiB = 32 GiB 的数据
- 1024KiB 的 L2 table,可以存储 131072 个 cluster 的地址,每个 L2 table 可以索引 131072 * 1024 KiB = 128 GiB 的数据
- 2048KiB 的 L2 table,可以存储 262144 个 cluster 的地址,每个 L2 table 可以索引 262144 * 2048 KiB = 512 GiB 的数据
注: 图片来源 https://www.ibm.com/blog/how-to-tune-qemu-l2-cache-size-and-qcow2-cluster-size/
为了读写 .qcow2 文件中的数据,QEMU 需要先根据 L2 table 找到数据的位置。由于每次 I/O 操作读取表的成本可能很高、L1 table 又足够小,为了提升性能,QEMU 会将 L1 table 放在内存中处理。而 L2 table 可能会很大,所以 QEMU 提供了一个参数 l2-cache-size 来控制有多少内存会被用于缓存 L2 table。
计算 l2-cache-size 的公式为 (in Byte):
disk_size = l2_cache_size * cluster_size / 8
Data cluster 大小的默认值是 64KiB。所以该公式可变形为:
disk_size = l2_cache_size * 8192
继续变形成容易计算的形式:
l2_cache_size = disk_size_GB * 131072